/** ***********************************************************************************
* @file         gsen_task.h
* @brief        加速度传感器数据处理任务
* @details      主要用来处理加速度传感器底层服务数，已经提供上传应用接口
* @author       杨小珛
* @date         2020/12/24
* @copyright    北京高知科技有限公司    
* @version      V1.0
* @attention    无
**************************************************************************************/
#ifndef SYS_GSEN_TASK_H
#define SYS_GSEN_TASK_H

#include "os_app.h"

#define GSEN_BMI160         OS_GSEN_BMI160_ENABLED
#define GSEN_LIS3DH         OS_GSEN_LIS3DH_ENABLED

#define GSEN_PORT_INTERRUPT_PIN ( 27 )
#define GSEN_INTER_SAM_REV_WAIT_TIME ( 20 )

#if ( GSEN_LIS3DH == 1 )
#define GSEN_ACCEL_INT_THRESHOLD_RUN   ( 50 )
#define GSEN_ACCEL_INT_THRESHOLD_SLEEP    ( 5 )
#endif

#if ( GSEN_BMI160 == 1 )
#define GSEN_ACCEL_INT_THRESHOLD_RUN   ( 200 )
#define GSEN_ACCEL_INT_THRESHOLD_SLEEP    ( 5 )
#endif

/******************************BMI160设备的状态 结构体**********************************/

typedef enum
{
    GSEN_WORK_ST_INIT = 0x00,
    GSEN_WORK_ST_ERR,
    GSEN_WORK_ST_OK,
} gsen_bmi160_work_state_e; /*GSEN设备的状态*/


typedef enum
{
    GSEN_ATT_ST_INIT = 0x00,
    GSEN_ATT_ST_CRASH,          /* 碰撞状态 */
    GSEN_ATT_ST_ROLLOVER,       /* 侧翻状态*/
    GSEN_ATT_ST_SHAKE,          /* 震动状态*/
    GSEN_ATT_ST_SHIFTING,       /* 移位状态*/
} gsen_bmi160_body_state_e;

typedef void ( *gsen_state_fun_t )( uint32_t st );

#define GSEN_SHOCK_MAX_TIME ( 5 )      /*连续运动3秒钟认为物体处于移动状态*/
#define GSEN_SILENT_MAX_TIME ( 10 )    /*连续静止6秒钟认为物体处于静止状态*/

/******************************BMI160传感器数据 结构体**********************************/

typedef struct
{

	/*! X-axis sensor data */
	volatile float x;
	/*! Y-axis sensor data */
	volatile float y;
	/*! Z-axis sensor data */
	volatile float z;
    
}gsen_bmi160_data;


typedef struct
{
    gsen_bmi160_data accel;                 /* 各个轴的加速度值*/
    gsen_bmi160_data gyro;                  /* 各个轴的角速度值*/
}gsen_bmi160_info_t;

/******************************BMI160 姿态 结构体**********************************/

#define GSEN_BMI160_KP ( 10.0f )        // 比例常数
#define GSEN_BMI160_KI ( 0.01f )        // 积分常数
#define GSEN_BMI160_HALFT ( 0.00018f )//半周期  

typedef struct
{
	volatile float q0;
	volatile float q1;
	volatile float q2;
	volatile float q3;
}quat_data_t;

typedef struct
{
	/*! Pitch（俯仰）：欧拉角向量的x轴 */
	volatile float pitch;
	/*! Yaw（偏航）：欧拉角向量的y轴 */
	volatile float yaw;
	/*! Roll（翻滚）： 欧拉角向量的z轴 */
	volatile float roll;
}euler_data_t;

typedef struct
{
	/*! X轴误差数据 */
	volatile float x;
	/*! Y轴误差数据 */
	volatile float y;
	/*! Z轴误差数据 */
	volatile float z;
}error_data_t;

typedef struct
{
    quat_data_t  quat;          /* 四元数 */
    error_data_t error;         /* 误差数据*/
    euler_data_t euler;         /* 欧拉角 */
}gsen_bmi160_posture_t;

/******************************BMI160 车身姿态分析 结构体**********************************/

#define GSEN_CACHE_DATA_LEN     ( 32 )


typedef struct
{
    volatile float *pitch;
    volatile float *roll;
    volatile float *yaw;
}cache_data_t;

typedef struct
{
    volatile uint32_t num;
    cache_data_t cache;
}gsen_bmi160_body_posture_t;

/** ****************************************************************************
* @remarks       void gsen_create_task( unsigned portBASE_TYPE uxPriority )
* @brief         创建GSEN基础数据处理任务
* @param[in]     uxPriority 优先级
* @param[out]    无
* @return        无
* @attention     在系统启动后进行创建
*******************************************************************************/
extern void gsen_create_task( unsigned portBASE_TYPE uxPriority );

/** ****************************************************************************
* @remarks       uint32_t gsen_bmi160_sensor_data_read( gsen_bmi160_info_t *info )
* @brief         读取加速度传感器数据，获取当前的状态。
* @param[in]     无
* @param[out]    *info 数据输出指针
* @return        pdPASS 成功 ；pdFAIL 失败
* @attention     无
*******************************************************************************/
extern uint32_t gsen_sensor_data_read( gsen_bmi160_info_t *info );

/** ****************************************************************************
* @remarks       gsen_bmi160_work_state_e gsen_sensor_work_st_get( void )
* @brief         获取加速度传感器的工作状态
* @param[in]     无
* @param[out]    无
* @return        GSEN_WORK_ST_ERR 状态失败  GSEN_WORK_ST_OK 状态成功
* @attention     无
*******************************************************************************/
extern gsen_bmi160_work_state_e gsen_sensor_work_st_get( void );

/** ****************************************************************************
* @remarks       void gsen_sensor_state_cb_set( gsen_state_fun_t fun )
* @brief         设置GSEN状态的回调函数
* @param[in]     fun 回调函数指针
* @param[out]    无
* @return        无
* @attention     无
*******************************************************************************/
extern void gsen_sensor_state_cb_set( gsen_state_fun_t fun );

/** ****************************************************************************
* @remarks       gsen_bmi160_body_state_e gsen_sensor_body_st_get( void )
* @brief         获取车身运动的状态
* @param[in]     无
* @param[out]    无
* @return        车身的运动状态
* @attention     无
*******************************************************************************/
extern gsen_bmi160_body_state_e gsen_sensor_body_st_get( void );

/** ****************************************************************************
* @remarks       void gsen_sensor_body_st_set( gsen_bmi160_body_state_e st )
* @brief         设置车身运动的状态
* @param[in]     无
* @param[out]    无
* @return        车身的运动状态
* @attention     无
*******************************************************************************/
extern void gsen_sensor_body_st_set( gsen_bmi160_body_state_e st );

/** ****************************************************************************
* @remarks       void gsen_lis3dh_data_get(gsen_bmi160_info_t *gsen_data)
* @brief         获取三轴最新数据
* @param[in]     pdata 三轴加速度数据存储位置
* @param[out]    无
* @return        无
* @attention     无
*******************************************************************************/
extern void gsen_lis3dh_data_get(gsen_bmi160_info_t *gsen_data);


#endif

